COBS: A Background

COBS is a field trial comparing biofuel systems and represents a unique opprotunity to utilize NGS in order to explore the distrubution of bacterail species associated with carbon cycleing and how they are distrubuted amongst the aggregate fractions in. Why do we care about agreggate fractions and the bacterial distrubution in each? We know that tillage and cropping systems have an effect on the distribution of aggregate sizes. We also know that bacterial species eveness is not consistant accross aggregate fractions. Let’s explore these points further by looking into the distribution of bacteria with the potential for carbohydrate degredation. The results from this study may inform agricultural management decisions based on the desired outcome for carbon cycling. I.E. more or less tillage to drive the aggregate size distribution and therefore the microbial community. Perhaps we can store more carbon in the soil with proper management techniques that facilitate the growth of a desired aggregate class based on the funciton you wish to achieve in the ecosystem.

We can do this by quantifying the amount of bacteria that have genes associated with carbon degrading enzymes of intrest. These enzymes are:

  1. endoglucanase [EC:3.2.1.4]
  2. pullulanase [EC:3.2.1.41]
  3. 1,4-beta-cellobiosidase [EC:3.2.1.91]
  4. beta-glucosidase [EC:3.2.1.21]
  5. beta-D-xylosidase 4 [EC:3.2.1.37]
  6. 6-phospho-beta-glucosidase [EC:3.2.1.86]

First, let’s confirm that we have the required tools for asking questions of the NCBI database. To do this we will use the NCBI API: Entrez Direct and install it via the UNIX command line.

pwd
cd ~
perl -MNet::FTP -e \
  '$ftp = new Net::FTP("ftp.ncbi.nlm.nih.gov", Passive => 1);
   $ftp->login; $ftp->binary;
   $ftp->get("/entrez/entrezdirect/edirect.zip");'
unzip -u -q edirect.zip
rm edirect.zip
export PATH=$PATH:$HOME/edirect
./edirect/setup.sh

Let’s take a look to confirm that it was installed in the home directory:

cd ~
ls
Applications
Box Sync
Desktop
Documents
Downloads
Google Drive
Keys
Library
Movies
Music
Pictures
Public
anaconda
chiAISME.R
edirect

Now that we have the tools, what will we use them for? COBS is a unique dataset that includes many metagenomes from soil aggregates. Many functions in ecosystems are microbially mediated and catalyzed by enzymes. In this study, funded by the DOE, we are interested in carnon cycleing and therefore the enyzmes associated with that funciton. Our collaborator (Kirsten Hofmockel) has identified a few enzymes of interest for our system. The list of enzymes is contained in a text file: ec_numbers.txt Let’s navigate to that directory and take a look:

cd ~/Documents/COBS_CAZY
cat ec_numbers.txt
3.2.1.4
3.2.1.91
3.2.1.21
3.2.1.37
3.2.1.41
3.2.1.86

We now have a list of enzymes of interest, let’s use those NCBI tools to find bacterial sequences associated with those enzymes by creating a python script:

import sys
from Bio import Entrez, SeqIO

Entrez.email = 'jflater@iastate.edu'

# First, find entries that contain the E.C. number
ec_num = sys.argv[1].strip()
#print ec_num
#print 'E.C. '+ ec_num
esearch_handle = Entrez.esearch(db='nucleotide', term='EC '+ec_num)
# When term='E.C. we get zero results, however, if term=EC it works
entries = Entrez.read(esearch_handle)
esearch_handle.close()

# Second, fetch these entries
efetch_handle = Entrez.efetch(db='nucleotide', id=entries['IdList'], rettype='gb', retmode='xml') 
records = Entrez.parse(efetch_handle)

# Now, we go through the records and look for a feature with name 'EC_number'
for record in records:
      for feature in record['GBSeq_feature-table']:
          for subfeature in feature['GBFeature_quals']:
              if (subfeature['GBQualifier_name'] == 'EC_number'   and
                subfeature['GBQualifier_value'] == ec_num):

                    # If we found it, we extract the seq's start and end
                    accession = record['GBSeq_primary-accession']
                    interval = feature['GBFeature_intervals'][0]
                    interval_start = interval['GBInterval_from']
                    interval_end = interval['GBInterval_to']
                    location = feature['GBFeature_location']
                    if location.startswith('complement'):
                        strand = 2
                    else:
                        strand = 1

                    # Now we fetch the nucleotide sequence
                    handle = Entrez.efetch(db="nucleotide", id=accession,
                                           rettype="fasta", strand=strand,
                                           seq_start = interval_start,
                                           seq_stop = interval_end)
                    seq = SeqIO.read(handle, "fasta")

                    print('>GenBank Accession:{}'.format(accession))
                    print(seq.seq)
efetch_handle.close()

Now let’s apply that script to our list of EC #’s by using the command line:

while read line;     
  do python scripts/nucl_from_ec.py $line > "$line".txt;    
  done < ec_numbers.txt
cd Documents/COBS_CAZY
less 3.2.1.37.txt 
>GenBank Accession:CP013238
ATGAATGCAAGATATTTTTATGTTGATAATTATATAATAAGCGCAAAAGATATTAAAGGACCTTGGAGTGAGCCGGTATATATTCATTCATCGGGATTTGATGCATCAATTTTCCATGATGATGATGGAAAGAAATATATAGTGTCTCTTGAGTGGGAAACAAGAGAAGGATATGAAAAACCAGGTGCAATATGTATTGTAGAATATTCTCCAAAAAAGAAAGAAATAATAGGATATCCTCAAAAGATATGGTCAGGAGGAACAGATAGAGGATGTATAGAAGCTCCACATCTAACAAAACGAGGAGATTATTACTATATAATGTGTGCAGAAGGAGGAACAGGATATGGACATAGCGTCACAATGGGAAGAAGTAAAAATATCTTAGGACCATTTGAAAAAGATCCTAAAAATCCAATTGTAACTTCTATTCCAGGGGACTTTAACGAAAGACACGACCCAGACCATTTAAAACCTAAATATTTTAATCCAAAATCAGTACTTCAAAAGTCTGGTCATGGAAGCTACGTAGAAACACCATTAGGTGAAGTATATCTCGTGCATCTTACAGCAAGACCATTTGTACCTGAATTAAGATGTACTTTAGGGAGAGAAACTGCTATTCAAAAAATGAAATGGACAGAAGATGGATGGCTTAGAATGGAAGATGGTTCTAATTTTGCAAAACAATATGTAGATGAAAGTAATATTAAAGAGTATAGAGTAGAGAAATGTCCGGATTTTGATGACTTTGATAAGGGAGAGCTAGGACTTCAATATTATTCTCCAAGAATAATGCCATCTTCTTTTGCAGATGTTAAAGCAAGACCTGGATATGTGAGAATAAGAGGGCAGGAATCAAGATGTTCATTAAATAAAGTAAGCATTCTTGCAAGAAAATTAACATCAGTTTATGCAGTAGTTACTACTAAAATGGAGTTTATTCCTTATGTGCACCAACATAGTGCAGGATTGATAATGTATTATGATAATATGAATTATATTTATCTAAGGAAATATTACAGCGACACATTAAAACATAGTGCAATTTCTGTAATTCATCTTGAAAACGGAGAAAAGACAGAATTTATAAATACAAGAACAAGGGTAGAAGATTCTCCTATTTACTTTAGATTGGTAATTGAAGGAAGAAAATCACATTTTGAATGGTCTTATGATGGTACAAACTATAGTGTAATCGGAAAAATCTTTGATACGACTAAATTTTCAGATGAATATTGTAAATATGGAGAATTTACAGGTACTTTTGTAGGAATAACATGTGCAGATAGAGTGCTTCATAAACATTATGCAGACTTTGATTTCTTTGAATATATAGCTGATGAAGATAAAAATGTAGAGTGA
>GenBank Accession:NZ_LJEQ01000017
ATGATTCAGAATCCTGTCTTTAGAGGTTTTAATCCTGACCCCTGTATATGCCGCCGCGGCGATGATTATTATGTGGCGGTATCATCATTTGAATGGTTTCCCGGACTACCGGTTTATCATTCAAGGGATCTTAAACATTGGCAATTGCTCACCCATGTGCTTACCGATGATAATAACCCAGACTTAAAAAAACTGCCTTCTGCCAAAGGTATTTGGGCCCCAAGCCTGACCTGGTGCGAAGAAGAAAAGCTGTTTTATGTCATTTATGGCGTTATGAATTCAATGAACTCCCGTTATTTTGACGTTGATAATTATCTTATTACCGCCGAGGAGATCACTGGCCCGTGGAGCGCCCCCGTTTATCTCCATTCTGCTGGATTCGATGCCTCAATTTTGCACGACCACGATGGCAGAAAATGGATCGTCTCACTGGAGTGGGAAACTCGCGAAGGCTATGAAAAACCGGGAGCGATCTGCCTGGTGGAATATTCGCCGCAGACGCACAGCGTCATCGGCTACCCGCAGCGCATCTGGCACGGCGGTACCGACCGCGGCTGCATTGAAGCGCCGCATCTGACGAGACGCGGCGACTATTACTACCTGATGGTCGCCGAAGGCGGCACCGGTTACGGGCATTCTGTCACCATGGCCCGCGCCACCGAGGTCGCTGGCCCCTATCAAGGCGATCCGCTCAATCCAATCGTCACATCCTGGCCAGAGAATTTTAACGAACGCAAAGATACAGGCCATCTCAAGCCCCACTATTTCAATCCGGAAACCTACCTGCAAAAGGCCGGGCACGGTAGCTATGTCGAGACCCCAACGGGTGAAGTCTGGCTAACCCACCTTTGCAGTCGTCCGTTTCGCCAGGAGCTACGCTGCCCGCTGGGTCGCGAAACGGCGATCCAAAGGATGGAATGGAGCGAGGATGGCTGGCTGCGCCTGGCCGCTGGGGGTCATCTCGCACAGCATCAGGTAGAAGGATCCCGTCTGCCGCCGCACCCGTTTCCACCAAAAGCGGACCTTGATGATTTTGATGAGCCAAGGGTGGATAACGCGTTTTATGCGCCGAGGATCCATTTCCAGCGTTTTACCTGCCTGACGCGTAAAGCAGGCTATCTTGCTCTACGCGGTCAGGAGTCGCTGAGCTCGCTCAATAAAGTCAGTCTGCTGGCGAAAAAGCTGACCTCGGTATACGCCAACATCAGTACGAAGATGGATTTTAACCCGGAGATTTATCAGCACAGCGCTGGACTGGTGCTCTATTACGACAACATGAACTATCTGTTTTTACATAAAACCTGGGATGAAACCTCTGGCGCGGCGCAACTGGCTATTATCTACATGGATAACGGTGAGCGTCACGACGATCCACAGAAAATTCGCCTTGCCGAGGGAGAAATCTATCTCGCGATTGCTATTAATGGCCGAGAGGTACAGTGTTCATGGTCTGTCGACGGTGAGCACTATCACCCCATCGGAGCGGTCTACGACACATCGCATTTCTCCGATGAATACAGCCGCTACGGCGAGTTTACCGGGGCGTTTGTCGGCATGGCCTGCGTGGATAGTATGCTGCATCGCAAAGAGGCGCTGTTTGATTTCTTCTGCTACCGGGCGGATGAAGACGCGATAATCGAGTAA
>GenBank Accession:NZ_LUTZ01000010
ATGTCCCTTATCCAAAACCCTATATTACGTGGTTTTAATGCCGACCCCAGCATTATCCGTGTTGAGGACACCTACTATATCGCCAACTCGACATTTGAGTGGTTTCCTGGCGTTCGTTTACATGAATCAAAAGATCTGAAGCACTGGAATCTTCTGCCGTCGCCATTGTCAACCACTACCCTCTTAGATATGAAGGGGAATCCGTCTTCAGGCGGTATTTGGGCTCCGGCGCTCTCTTATGCGGATGGTAAATTCTGGTTAGTGTATACCGATGTGAAAGTCACCGAAGGTGCCTTTAAAGACATGACAAACTACCTGACCACCGCAACAGATATTCGCGGCCCGTGGAGTGCGCCGATAAAACTGAATGGCGTGGGTTTCGATGCTTCACTTTTCCATGACGATGATGGCCGTAAATATATTGTGCAACAGACGTGGGATCATCGGGAGTACCACCATCCTTTTGATGGGATTACCTTAACAGAGCTTGATACAACAACTTTAAAATTAATGCCGGAAACCGCACGGACCATCTATCGCGGTACCGCAGTAGCGCTCGTTGAGGGGCCGCATCTCTATAAACTGAACGGTTATTACTATCTCTTTGCCGCTCAAGGGGGGACGGTATTTACTCATCAGGAGGTGGTGGCCCGTTCCACCACTTTAAATGCCGACAGCTTTGAAACCGAGCCTGGAGAAGTATTCTTAACTAACGTTGATACCCCTGACAGCTATATCCAGAAGCAAGGACACGGCGCTTTGGTTTCGACGCCCGAAGGCGAATGGTATTATGCTTCGCTGTGCGCTCGTCCGTGGAATCGTCCCGGAGAATCAATCTATGATCCTCGCGGCTGGTCTACCCTTGGCCGGGAAACGGCCATCCAAAAAGTATATTGGGATGAAGATGGCTGGCCGCGTATTGAAGGCGGTCACGGCGGTAAAACGTTTGTCGAGGGCCCGAAAGACGCCATTTATACCGAAAGCGCGAAAGATAATAGCCAGCACGATGAATTTACTACGCCAGCGCTTAATCTTAACTGGAATACCCTGCGGGTGCCTTTTAGCGAAAAAATGGGTACCACAGGCCATGGAAAGCTCACCTTAATCGGCCAGGGTTCATTAGCGAATACCCATGATCTGTCGTTGATTGCCCGCCGCTGGCAAGCCTTTTATTTTAATGCTGAAGTTAAAGTCGCCTTTAATCCTTTCAGCTACCAACAAATGGCCGGATTAACCAATTACTACAACGACCGTCACTGGAGCTTTGCTTTTGTTACCTGGAATGAAATTAACGGCAGAGTCATCGAGGTCGCCGAGAACAATCGTGGAAAATATACTTCGTACCTGAAAGATAACGCGATTAAGATTCCTGACGACGTCGAATACGTGTGGTTACGGACGAAAGTCAGGAAGCAGACCTATAGCTATGAGTATAGTTTTGACGGCGTCGATTTTATTGAAATTCCGGTAGTTTTAGATGCCGCCGTCCTTTCCGATGACTATGTTCTGCAAAGCTATGGCGGGTTCTTTACCGGTGCATTTGTAGGTCTTGCGGCAGTAGACTACTCAGGCTACGGCGCCAGCGCTGAATTTTATCATTTCGATTATCAAGAGTTTGGCGACTCGTTAATTGGCACGGATGTTTATAGTTGGGAGGCTGGCGAGCTACGTGCTGATTAG
>GenBank Accession:NZ_CAKZ01000125
ATGACTATCTATAAGGACCCAACCCGTCCGGTGGCTGAACGCGTCGCCGATTTGCTCGCCCGCATGACGCCGGAGGAGAAATTCGCCCAGATGCACGCTTACTGGCTGGTGCTGTCGCCGGAGGGCGATCACCGGGAGCGAACCGATTTGAGCGATGAGTTTTCCGGCGCGACCCAGCAGGCGGCGCTGACCGAACGTCTGAAACGCGGCGCGGGGCAGATAACCCGCCCGCTCGGCACCCATATCGTCGCGCCGCGGGAGGGCGTGCGCGCCGCTAACCGTCTGCAGAAAATGCTGGTGGAAGAGACGCGGCTCGGCATTCCCGCCATGTTCCATGAAGAGTGCCTGGTGGGGCTGCTATGCAAAGACGCGACGCTGTTTCCGTCGTCGCTCAACTACGGTTCCACCTGGGATCCGCAGCTGGTGGAGCAGGCCGCGCAGGCTATCGGGCGTGAAGCGCGCGCCGTCGGCTGTCATCAGGGCCTCGCGCCGGTGCTCGATGTGTCGCGCGACGTGCGCTGGGGCCGCACGGAAGAAACCTTTGGCGAAGATCCGTGGCTGGTGGGCGTGATGGCGACCCGCTACGTGAAAGGGCTACAGGGGCCGCAGCGGGATCTGCTCGCGACCCTCAAGCACTACGTCGGCCACTCGTTCAGCGAAGGCGCGCGCAACCATGCGCCGGTGCACCTCGGCTTTTGCGAACTCAACGACACCTTCCTGCTGCCGTTTGAAATGGCGGTGAAGCTGGCGCACGCGGGCTCGGTGATGCCTGCGTATCACGATATCGATAACGTGCCGACCCACGCCGATGATTTCCTCCTCACACAAGTATTGCGCGAACAATGGGGCTTTGACGGCATTATCGTCGCCGACTACGGTGGTGTAAGCCTGCTGCATCAGCACCACGGCGTGGCGCAGGACGCGGCGCACTCGGCGGCGCTGGCCTTTAATGCGGGGCTGGATATCGAACTGCCGAAAGACGACTGCGCGCGCCATCTGGCGCAGGCGCTGGCGCGCGGGCTTATCACGATGGAAAAAGTGGATAAAATTGTGGCGCGCGTGCTGGGCGAAAAGTTCCGTCTCGGACTGTTTGAACAGCCGTATGCCGATGAGAACGCCATTACGCTGCAAAGCGACGAGACGCGCCGCATCGCCCGCGAGGTGGCGGCGCGTTCCCTGACGCTGCTTGAGAATAACGGTGTGCTGCCGCTTCAGGGTACGCCGCGCGTGGCGGTAGTCGGGCCGACGGCGGACGATCCGCTGGCGCTGCTGAGCGGCTACAGCTTCCCGGTGCATCTCATCATCAGCGATATGCTGGAGCAGACAAGCCAGGTGACGACGCCGCTTGCCGCGCTGCGCGAACAGCTCGGTGGCGCGCTCGCAGGCTATGCCAAAGGCTGTCATATCATTGAGAAACGCATGGCGGGCGCGCCGGTGTTCCCCGGCGACAGCGGCGAAAAACCGATGCAGCAGTCGCCGGTCTCAGACGATGTGTCGCTCATCCCGGACGCAGTGGCGCTCGCCGGACAAAGCGACGTGGTGCTGGCGTTTGTCGGCGATCTCTCCGGGCTGTTCCAGAGCGGCACCGTGGGCGAAGGCTCTGACACCGACAGCCTGCAACTGCCGGGCGTGCAGCAACAGCTGCTGGAGGCGCTGGTGGAAACGGGTAAGCCGGTCGTGGTCGTGATGACCGGCGGTCGCCCTTATCACCTGGGCGGGCTGGAGTCGCGCGTCGCGGCGTGGGTGATGGCCTGGGCGCCGGGGCAGGAGGGCGGACACGCGATTGCGGATCTGCTGACCGGCAAAGCGGAACCGCAGGGCCGGTTAGTGGTGTCGGTGCCGAAAAGCGCAGGCGCGATGCCGTACTACTACAACCATAAGCTCAAAAGCGGCGGCACGCCTTACGCGTTTCACTTCGGCTCACGCTACCCGTTCGGCTACGGCAAAACCTGGACCGAATTCCGCTATGGCGCCCTGGACATCGCCCAGGCGCGCGTGCCGATGGCGGGCGAGGTGGAGGTATCGGTTACCGTCACCAACAGCGGCGCGCAGGCGGGCAGCGAGGTGGTACAGCTGTATGTGCACGATAAAGTAGCCTCGATGGTCCGCCCGGTGCAGGAGCTGAAAGCCTTCGGGCGCGTTACGCTTGCCCCTGGCGCCAGCGCGCGCGTTACGTTCCGCGTGCCGGTCGATATGCTCAGTTTCACGCGTCGTGATGGCGCACGCATTGTCGAGCCTGGCGAGTTTGACATTCGCGTTGGGGCCAATAGCGGCGATATTCGCAGTCGCGGCACCGTTATTGTGGAAGGCGAAACCCAGGTGCTGGGAAATAGCTGGCGGATGCTGAGTGAGTGTCATGTTGAGCAATAA
>GenBank Accession:NZ_AFMO01000196
GTGCCGAAAAGCGCGGGCGCGATGCCTTACTATTACAATCACAAGCTCAAAAGCGGCGGCACGCCTTACGCGTTTCACTTCGGCTCGCGCTACCCGTTCGGCTACGGCAAAACCTGGACAATGTTCCGCTACGGCGAGCTGGAAATCGCGCAGTCGCGCGTGCCGATGAATGGCGATGTTGAGGCATCTGTCACCGTCACTAACAGCGGTACGCAGCCGGGCAGCGAGGTGGTGCAGCTCTATGTGCGCGATAACGTGGCCTCGCTGGTGCGGCCGGTGCAGGAGCTGAAAGCCTTCGGGCGGGTCTCGCTTGCGCCTGGCGAGAGCGCGCGCGTTACGTTCCGCATCCCTGTCGATATGCTTAATTTCACGAGCCGCGATGGTGTTCGTATTGTCGAGCCTGGCGAGTTTGAAATCCGCGTCGGCGCTAACAGTGGCGATATCCGCAGCCGCGGCACCGTGACCGTGGAAGGGGAAACGCACGTGCTCGGAAATAACTGGCGTATGCTCAGTGAGTGTTGTGTTGAGCAATAA

To use hpcc: Lot’s of disc space, temporary unlimited (3 months)

ssh *****@hpcc.msu.edu
password:
#We are now at the gateway, we must connect to a development node
ssh dv-intel16
#Now we move to a scratch folder
cd /mnt/scratch/*****

Now that we are in a space where we can download data and perform work, let’s download the NCBI db

#Make a directory for this project
mkdir COBS_CAZY
cd COBS_CAZY/
#now we create a program to downlaod the db
emacs download.refseq.qsub

now lets download db to that ftp://ftp.ncbi.nlm.nih.gov refseq_protien.10.tar.gz.md5 and *.gz is what we want to put on HPCC

pwd
cd Documents/COBS_CAZY/scripts
cat download.refseq.qsub
/Users/jaredflater
#!/bin/bash ~login

### define resources needed:
### walltime - how long you expec the job to run
#PBS -l walltime=40:00:00

### nodes:ppn - how many nodes & cores per node (ppn) that you require
#PBS -l nodes=1:ppn=1

### mem: amount of memory that the job will need
#PBS -l mem=4gb

#PBS -q main
#PBS -M youremail@email.com
#PBS -m your department

### you can give your job a name for easier identification
#PBS -N yourname

### load module

### Change directory
cd /mnt/scratch/username/COBS_CAZY

### call
wget ftp://ftp.cbi.nlm.nih.gov/blast/db/refseq_protein.* -P resfeq_protein

In HPC: move out of dev intel…everyone is using it. There are many more computers to choose from begind that…called nodes We want to work in a node, we need to submit a job by using qsub

[*****@dev-intel16 ~]$ cd /mnt/scratch/***** [*****@dev-intel16 *****]$ ls [*****@dev-intel16 *****]$ mkdir COBS_CAZY [*****@dev-intel16 *****]$ cd COBS_CAZY/ [*****@dev-intel16 COBS_CAZY]$ emacs download.refseq.qsub

[1]+ Stopped emacs download.refseq.qsub [*****@dev-intel16 COBS_CAZY]$ ls download.refseq.qsub download.refseq.qsub~ [*****@dev-intel16 COBS_CAZY]$ rm *~ [*****@dev-intel16 COBS_CAZY]$ ls download.refseq.qsub [*****@dev-intel16 COBS_CAZY]$ qsub download.refseq.qsub 37523906.mgr-04.i [*****@dev-intel16 COBS_CAZY]$ ls download.refseq.qsub [*****@dev-intel16 COBS_CAZY]$

.o is output, .e is error

S = Q in line S = R running S = C complete

Check if everything downloaded correctly by using md5(it tells us if downloaded correctly) Once all is downlaoded, unzip

Then ready to run blastp (files in fasta) clone the github repository # note change spellin on protein for emacs

module load git (to upload repository) git clone url once repository is uploaded then blastp

submit blastp: qsub blastp.qsub

2016_12_02:09:06 AM, Noticed that we did not qsub blastp for EC *.86, let’s make that script and submit the job.

ssh *****@hpcc.msu.edu
password:
ssh dev-intel16
cd /mnt/scratch/*****/COBS_CAZY
ls
LS0tCnRpdGxlOiAiQ09CU19DQVpZIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKcm9vdDogLi4vLi4vLi4vCi0tLQohW10oaW1hZ2VzL0NPQlNQSUMucG5nKQotLS0tLS0KI0NPQlM6IEEgQmFja2dyb3VuZAoKQ09CUyBpcyBhIGZpZWxkIHRyaWFsIGNvbXBhcmluZyBiaW9mdWVsIHN5c3RlbXMgYW5kIHJlcHJlc2VudHMgYSB1bmlxdWUgb3Bwcm90dW5pdHkgdG8gdXRpbGl6ZSBOR1MgaW4gb3JkZXIgdG8gZXhwbG9yZSB0aGUgZGlzdHJ1YnV0aW9uIG9mIGJhY3RlcmFpbCBzcGVjaWVzIGFzc29jaWF0ZWQgd2l0aCBjYXJib24gY3ljbGVpbmcgYW5kIGhvdyB0aGV5IGFyZSBkaXN0cnVidXRlZCBhbW9uZ3N0IHRoZSBhZ2dyZWdhdGUgZnJhY3Rpb25zIGluLiBXaHkgZG8gd2UgY2FyZSBhYm91dCBhZ3JlZ2dhdGUgZnJhY3Rpb25zIGFuZCB0aGUgYmFjdGVyaWFsIGRpc3RydWJ1dGlvbiBpbiBlYWNoPyBXZSBrbm93IHRoYXQgdGlsbGFnZSBhbmQgY3JvcHBpbmcgc3lzdGVtcyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIGFnZ3JlZ2F0ZSBzaXplcy4gV2UgYWxzbyBrbm93IHRoYXQgYmFjdGVyaWFsIHNwZWNpZXMgZXZlbmVzcyBpcyBub3QgY29uc2lzdGFudCBhY2Nyb3NzIGFnZ3JlZ2F0ZSBmcmFjdGlvbnMuIExldCdzIGV4cGxvcmUgdGhlc2UgcG9pbnRzIGZ1cnRoZXIgYnkgbG9va2luZyBpbnRvIHRoZSBkaXN0cmlidXRpb24gb2YgYmFjdGVyaWEgd2l0aCB0aGUgcG90ZW50aWFsIGZvciBjYXJib2h5ZHJhdGUgZGVncmVkYXRpb24uIFRoZSByZXN1bHRzIGZyb20gdGhpcyBzdHVkeSBtYXkgaW5mb3JtIGFncmljdWx0dXJhbCBtYW5hZ2VtZW50IGRlY2lzaW9ucyBiYXNlZCBvbiB0aGUgZGVzaXJlZCBvdXRjb21lIGZvciBjYXJib24gY3ljbGluZy4gSS5FLiBtb3JlIG9yIGxlc3MgdGlsbGFnZSB0byBkcml2ZSB0aGUgYWdncmVnYXRlIHNpemUgZGlzdHJpYnV0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIG1pY3JvYmlhbCBjb21tdW5pdHkuIFBlcmhhcHMgd2UgY2FuIHN0b3JlIG1vcmUgY2FyYm9uIGluIHRoZSBzb2lsIHdpdGggcHJvcGVyIG1hbmFnZW1lbnQgdGVjaG5pcXVlcyB0aGF0IGZhY2lsaXRhdGUgdGhlIGdyb3d0aCBvZiBhIGRlc2lyZWQgYWdncmVnYXRlIGNsYXNzIGJhc2VkIG9uIHRoZSBmdW5jaXRvbiB5b3Ugd2lzaCB0byBhY2hpZXZlIGluIHRoZSBlY29zeXN0ZW0uIAoKV2UgY2FuIGRvIHRoaXMgYnkgcXVhbnRpZnlpbmcgdGhlIGFtb3VudCBvZiBiYWN0ZXJpYSB0aGF0IGhhdmUgZ2VuZXMgYXNzb2NpYXRlZCB3aXRoIGNhcmJvbiBkZWdyYWRpbmcgZW56eW1lcyBvZiBpbnRyZXN0LiBUaGVzZSBlbnp5bWVzIGFyZTogCgogIDEuIGVuZG9nbHVjYW5hc2UgW0VDOjMuMi4xLjRdCiAgMi4gcHVsbHVsYW5hc2UgW0VDOjMuMi4xLjQxXQogIDMuIDEsNC1iZXRhLWNlbGxvYmlvc2lkYXNlIFtFQzozLjIuMS45MV0KICA0LiBiZXRhLWdsdWNvc2lkYXNlIFtFQzozLjIuMS4yMV0KICA1LiBiZXRhLUQteHlsb3NpZGFzZSA0IFtFQzozLjIuMS4zN10KICA2LiA2LXBob3NwaG8tYmV0YS1nbHVjb3NpZGFzZSBbRUM6My4yLjEuODZdCgohW10oaW1hZ2VzL0FHR2Rpc3QucG5nKQpGaXJzdCwgbGV0J3MgY29uZmlybSB0aGF0IHdlIGhhdmUgdGhlIHJlcXVpcmVkIHRvb2xzIGZvciBhc2tpbmcgcXVlc3Rpb25zIG9mIHRoZSBOQ0JJIGRhdGFiYXNlLiBUbyBkbyB0aGlzIHdlIHdpbGwgdXNlIHRoZSBOQ0JJIEFQSTogRW50cmV6IERpcmVjdCBhbmQgaW5zdGFsbCBpdCB2aWEgdGhlIFVOSVggY29tbWFuZCBsaW5lLiAKYGBge2Jhc2gsIGV2YWw9RkFMU0V9CnB3ZApjZCB+CnBlcmwgLU1OZXQ6OkZUUCAtZSBcCiAgJyRmdHAgPSBuZXcgTmV0OjpGVFAoImZ0cC5uY2JpLm5sbS5uaWguZ292IiwgUGFzc2l2ZSA9PiAxKTsKICAgJGZ0cC0+bG9naW47ICRmdHAtPmJpbmFyeTsKICAgJGZ0cC0+Z2V0KCIvZW50cmV6L2VudHJlemRpcmVjdC9lZGlyZWN0LnppcCIpOycKdW56aXAgLXUgLXEgZWRpcmVjdC56aXAKcm0gZWRpcmVjdC56aXAKZXhwb3J0IFBBVEg9JFBBVEg6JEhPTUUvZWRpcmVjdAouL2VkaXJlY3Qvc2V0dXAuc2gKYGBgCkxldCdzIHRha2UgYSBsb29rIHRvIGNvbmZpcm0gdGhhdCBpdCB3YXMgaW5zdGFsbGVkIGluIHRoZSBob21lIGRpcmVjdG9yeToKYGBge2Jhc2h9CmNkIH4KbHMKYGBgCk5vdyB0aGF0IHdlIGhhdmUgdGhlIHRvb2xzLCB3aGF0IHdpbGwgd2UgdXNlIHRoZW0gZm9yPyBDT0JTIGlzIGEgdW5pcXVlIGRhdGFzZXQgdGhhdCBpbmNsdWRlcyBtYW55IG1ldGFnZW5vbWVzIGZyb20gc29pbCBhZ2dyZWdhdGVzLiBNYW55IGZ1bmN0aW9ucyBpbiBlY29zeXN0ZW1zIGFyZSBtaWNyb2JpYWxseSBtZWRpYXRlZCBhbmQgY2F0YWx5emVkIGJ5IGVuenltZXMuIEluIHRoaXMgc3R1ZHksIGZ1bmRlZCBieSB0aGUgRE9FLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjYXJub24gY3ljbGVpbmcgYW5kIHRoZXJlZm9yZSB0aGUgZW55em1lcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBmdW5jaXRvbi4gT3VyIGNvbGxhYm9yYXRvciAoS2lyc3RlbiBIb2Ztb2NrZWwpIGhhcyBpZGVudGlmaWVkIGEgZmV3IGVuenltZXMgb2YgaW50ZXJlc3QgZm9yIG91ciBzeXN0ZW0uIFRoZSBsaXN0IG9mIGVuenltZXMgaXMgY29udGFpbmVkIGluIGEgdGV4dCBmaWxlOiBlY19udW1iZXJzLnR4dApMZXQncyBuYXZpZ2F0ZSB0byB0aGF0IGRpcmVjdG9yeSBhbmQgdGFrZSBhIGxvb2s6CmBgYHtiYXNofQpjZCB+L0RvY3VtZW50cy9DT0JTX0NBWlkKY2F0IGVjX251bWJlcnMudHh0CmBgYApXZSBub3cgaGF2ZSBhIGxpc3Qgb2YgZW56eW1lcyBvZiBpbnRlcmVzdCwgbGV0J3MgdXNlIHRob3NlIE5DQkkgdG9vbHMgdG8gZmluZCBiYWN0ZXJpYWwgc2VxdWVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSBlbnp5bWVzIGJ5IGNyZWF0aW5nIGEgcHl0aG9uIHNjcmlwdDogIApgYGB7cHl0aG9uLCBldmFsPUZBTFNFfQppbXBvcnQgc3lzCmZyb20gQmlvIGltcG9ydCBFbnRyZXosIFNlcUlPCgpFbnRyZXouZW1haWwgPSAnamZsYXRlckBpYXN0YXRlLmVkdScKCiMgRmlyc3QsIGZpbmQgZW50cmllcyB0aGF0IGNvbnRhaW4gdGhlIEUuQy4gbnVtYmVyCmVjX251bSA9IHN5cy5hcmd2WzFdLnN0cmlwKCkKI3ByaW50IGVjX251bQojcHJpbnQgJ0UuQy4gJysgZWNfbnVtCmVzZWFyY2hfaGFuZGxlID0gRW50cmV6LmVzZWFyY2goZGI9J251Y2xlb3RpZGUnLCB0ZXJtPSdFQyAnK2VjX251bSkKIyBXaGVuIHRlcm09J0UuQy4gd2UgZ2V0IHplcm8gcmVzdWx0cywgaG93ZXZlciwgaWYgdGVybT1FQyBpdCB3b3JrcwplbnRyaWVzID0gRW50cmV6LnJlYWQoZXNlYXJjaF9oYW5kbGUpCmVzZWFyY2hfaGFuZGxlLmNsb3NlKCkKCiMgU2Vjb25kLCBmZXRjaCB0aGVzZSBlbnRyaWVzCmVmZXRjaF9oYW5kbGUgPSBFbnRyZXouZWZldGNoKGRiPSdudWNsZW90aWRlJywgaWQ9ZW50cmllc1snSWRMaXN0J10sIHJldHR5cGU9J2diJywgcmV0bW9kZT0neG1sJykgCnJlY29yZHMgPSBFbnRyZXoucGFyc2UoZWZldGNoX2hhbmRsZSkKCiMgTm93LCB3ZSBnbyB0aHJvdWdoIHRoZSByZWNvcmRzIGFuZCBsb29rIGZvciBhIGZlYXR1cmUgd2l0aCBuYW1lICdFQ19udW1iZXInCmZvciByZWNvcmQgaW4gcmVjb3JkczoKICAgICAgZm9yIGZlYXR1cmUgaW4gcmVjb3JkWydHQlNlcV9mZWF0dXJlLXRhYmxlJ106CiAgICAgICAgICBmb3Igc3ViZmVhdHVyZSBpbiBmZWF0dXJlWydHQkZlYXR1cmVfcXVhbHMnXToKICAgICAgICAgICAgICBpZiAoc3ViZmVhdHVyZVsnR0JRdWFsaWZpZXJfbmFtZSddID09ICdFQ19udW1iZXInICAgYW5kCiAgICAgICAgICAgICAgICBzdWJmZWF0dXJlWydHQlF1YWxpZmllcl92YWx1ZSddID09IGVjX251bSk6CgogICAgICAgICAgICAgICAgICAgICMgSWYgd2UgZm91bmQgaXQsIHdlIGV4dHJhY3QgdGhlIHNlcSdzIHN0YXJ0IGFuZCBlbmQKICAgICAgICAgICAgICAgICAgICBhY2Nlc3Npb24gPSByZWNvcmRbJ0dCU2VxX3ByaW1hcnktYWNjZXNzaW9uJ10KICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IGZlYXR1cmVbJ0dCRmVhdHVyZV9pbnRlcnZhbHMnXVswXQogICAgICAgICAgICAgICAgICAgIGludGVydmFsX3N0YXJ0ID0gaW50ZXJ2YWxbJ0dCSW50ZXJ2YWxfZnJvbSddCiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfZW5kID0gaW50ZXJ2YWxbJ0dCSW50ZXJ2YWxfdG8nXQogICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gZmVhdHVyZVsnR0JGZWF0dXJlX2xvY2F0aW9uJ10KICAgICAgICAgICAgICAgICAgICBpZiBsb2NhdGlvbi5zdGFydHN3aXRoKCdjb21wbGVtZW50Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmFuZCA9IDIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzdHJhbmQgPSAxCgogICAgICAgICAgICAgICAgICAgICMgTm93IHdlIGZldGNoIHRoZSBudWNsZW90aWRlIHNlcXVlbmNlCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gRW50cmV6LmVmZXRjaChkYj0ibnVjbGVvdGlkZSIsIGlkPWFjY2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHR5cGU9ImZhc3RhIiwgc3RyYW5kPXN0cmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcV9zdGFydCA9IGludGVydmFsX3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxX3N0b3AgPSBpbnRlcnZhbF9lbmQpCiAgICAgICAgICAgICAgICAgICAgc2VxID0gU2VxSU8ucmVhZChoYW5kbGUsICJmYXN0YSIpCgogICAgICAgICAgICAgICAgICAgIHByaW50KCc+R2VuQmFuayBBY2Nlc3Npb246e30nLmZvcm1hdChhY2Nlc3Npb24pKQogICAgICAgICAgICAgICAgICAgIHByaW50KHNlcS5zZXEpCmVmZXRjaF9oYW5kbGUuY2xvc2UoKQoKYGBgCk5vdyBsZXQncyBhcHBseSB0aGF0IHNjcmlwdCB0byBvdXIgbGlzdCBvZiBFQyAjJ3MgYnkgdXNpbmcgdGhlIGNvbW1hbmQgbGluZToKYGBge2Jhc2gsIGV2YWw9RkFMU0V9CndoaWxlIHJlYWQgbGluZTsgICAgIAogIGRvIHB5dGhvbiBzY3JpcHRzL251Y2xfZnJvbV9lYy5weSAkbGluZSA+ICIkbGluZSIudHh0OyAgICAKICBkb25lIDwgZWNfbnVtYmVycy50eHQKYGBgCgpgYGB7YmFzaH0KY2QgRG9jdW1lbnRzL0NPQlNfQ0FaWQpsZXNzIDMuMi4xLjM3LnR4dCAKYGBgCgpUbyB1c2UgaHBjYzoKTG90J3Mgb2YgZGlzYyBzcGFjZSwgdGVtcG9yYXJ5IHVubGltaXRlZCAoMyBtb250aHMpCmBgYHtiYXNofQpzc2ggKioqKipAaHBjYy5tc3UuZWR1CnBhc3N3b3JkOgojV2UgYXJlIG5vdyBhdCB0aGUgZ2F0ZXdheSwgd2UgbXVzdCBjb25uZWN0IHRvIGEgZGV2ZWxvcG1lbnQgbm9kZQpzc2ggZHYtaW50ZWwxNgojTm93IHdlIG1vdmUgdG8gYSBzY3JhdGNoIGZvbGRlcgpjZCAvbW50L3NjcmF0Y2gvKioqKioKYGBgCgpOb3cgdGhhdCB3ZSBhcmUgaW4gYSBzcGFjZSB3aGVyZSB3ZSBjYW4gZG93bmxvYWQgZGF0YSBhbmQgcGVyZm9ybSB3b3JrLCBsZXQncyBkb3dubG9hZCB0aGUgTkNCSSBkYgpgYGB7YmFzaH0KI01ha2UgYSBkaXJlY3RvcnkgZm9yIHRoaXMgcHJvamVjdApta2RpciBDT0JTX0NBWlkKY2QgQ09CU19DQVpZLwojbm93IHdlIGNyZWF0ZSBhIHByb2dyYW0gdG8gZG93bmxhb2QgdGhlIGRiCmVtYWNzIGRvd25sb2FkLnJlZnNlcS5xc3ViCmBgYAoKbm93IGxldHMgZG93bmxvYWQgZGIgdG8gdGhhdCAgZnRwOi8vZnRwLm5jYmkubmxtLm5paC5nb3YKcmVmc2VxX3Byb3RpZW4uMTAudGFyLmd6Lm1kNSBhbmQgKi5neiBpcyB3aGF0IHdlIHdhbnQgdG8gcHV0IG9uIEhQQ0MKYGBge2Jhc2h9CnB3ZApjZCBEb2N1bWVudHMvQ09CU19DQVpZL3NjcmlwdHMKY2F0IGRvd25sb2FkLnJlZnNlcS5xc3ViCmBgYAoKSW4gSFBDOiBtb3ZlIG91dCBvZiBkZXYgaW50ZWwuLi5ldmVyeW9uZSBpcyB1c2luZyBpdC4gVGhlcmUgYXJlIG1hbnkgbW9yZSBjb21wdXRlcnMgdG8gY2hvb3NlIGZyb20gYmVnaW5kIHRoYXQuLi5jYWxsZWQgbm9kZXMKV2Ugd2FudCB0byB3b3JrIGluIGEgbm9kZSwgd2UgbmVlZCB0byBzdWJtaXQgYSBqb2IgYnkgdXNpbmcgcXN1YgpgYGB7YmFzaCwgZXZhbD1GQUxTRX0KCmBgYAoKWyoqKioqQGRldi1pbnRlbDE2IH5dJCBjZCAvbW50L3NjcmF0Y2gvKioqKioKWyoqKioqQGRldi1pbnRlbDE2ICoqKioqXSQgbHMKWyoqKioqQGRldi1pbnRlbDE2ICoqKioqXSQgbWtkaXIgQ09CU19DQVpZClsqKioqKkBkZXYtaW50ZWwxNiAqKioqKl0kIGNkIENPQlNfQ0FaWS8KWyoqKioqQGRldi1pbnRlbDE2IENPQlNfQ0FaWV0kIGVtYWNzIGRvd25sb2FkLnJlZnNlcS5xc3ViCgpbMV0rICBTdG9wcGVkICAgICAgICAgICAgICAgICBlbWFjcyBkb3dubG9hZC5yZWZzZXEucXN1YgpbKioqKipAZGV2LWludGVsMTYgQ09CU19DQVpZXSQgbHMKZG93bmxvYWQucmVmc2VxLnFzdWIgIGRvd25sb2FkLnJlZnNlcS5xc3VifgpbKioqKipAZGV2LWludGVsMTYgQ09CU19DQVpZXSQgcm0gKn4KWyoqKioqQGRldi1pbnRlbDE2IENPQlNfQ0FaWV0kIGxzCmRvd25sb2FkLnJlZnNlcS5xc3ViClsqKioqKkBkZXYtaW50ZWwxNiBDT0JTX0NBWlldJCBxc3ViIGRvd25sb2FkLnJlZnNlcS5xc3ViCjM3NTIzOTA2Lm1nci0wNC5pClsqKioqKkBkZXYtaW50ZWwxNiBDT0JTX0NBWlldJCBscwpkb3dubG9hZC5yZWZzZXEucXN1YgpbKioqKipAZGV2LWludGVsMTYgQ09CU19DQVpZXSQKCi5vIGlzIG91dHB1dCwgLmUgaXMgZXJyb3IKClMgPSBRIGluIGxpbmUKUyA9IFIgcnVubmluZwpTID0gQyBjb21wbGV0ZQoKQ2hlY2sgaWYgZXZlcnl0aGluZyBkb3dubG9hZGVkIGNvcnJlY3RseSBieSB1c2luZyBtZDUoaXQgdGVsbHMgdXMgaWYgZG93bmxvYWRlZCBjb3JyZWN0bHkpCk9uY2UgYWxsIGlzIGRvd25sYW9kZWQsIHVuemlwCgoKClRoZW4gcmVhZHkgdG8gcnVuIGJsYXN0cCAoZmlsZXMgaW4gZmFzdGEpIGNsb25lIHRoZSBnaXRodWIgcmVwb3NpdG9yeQojIG5vdGUgY2hhbmdlIHNwZWxsaW4gb24gcHJvdGVpbiBmb3IgZW1hY3MKCm1vZHVsZSBsb2FkIGdpdCAodG8gdXBsb2FkIHJlcG9zaXRvcnkpCmdpdCBjbG9uZSB1cmwKb25jZSByZXBvc2l0b3J5IGlzIHVwbG9hZGVkIHRoZW4gYmxhc3RwCgpzdWJtaXQgYmxhc3RwOiBxc3ViIGJsYXN0cC5xc3ViCgojMjAxNl8xMl8wMjowOTowNiBBTSwgTm90aWNlZCB0aGF0IHdlIGRpZCBub3QgcXN1YiBibGFzdHAgZm9yIEVDICouODYsIGxldCdzIG1ha2UgdGhhdCBzY3JpcHQgYW5kIHN1Ym1pdCB0aGUgam9iLiAKYGBge2Jhc2gsIGV2YWw9RkFMU0V9CnNzaCAqKioqKkBocGNjLm1zdS5lZHUKcGFzc3dvcmQ6CnNzaCBkZXYtaW50ZWwxNgpjZCAvbW50L3NjcmF0Y2gvKioqKiovQ09CU19DQVpZCmxzCgpgYGAKCg==